package com.myapp.actions;

import com.myapp.bd.QueryBD;
import com.myapp.bean.Enseignant;
import com.myapp.bean.Etudiant;
import com.myapp.bean.MaitreDeStage;
import com.myapp.forms.NotificationForm;
import com.myapp.mail.EnvoyerMail;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class NotificationAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws SQLException {
        // Si le paramètre numNotif est à null 
        //       --- alors il s'agit de "l'arrivée" la jsp notification
        //       --- sinon il s'agit du valider de la jsp notification
        //Récupération des 3 listes des étudiants (L3C,M1C et M2C)
        QueryBD qBD = new QueryBD();
        if (request.getParameter("typeNotif") == null) {            
            ArrayList<Etudiant> listEtudiantsL3C = (ArrayList<Etudiant>) qBD.recupListeEtudiantParPromo("L3C");
            ArrayList<Etudiant> listEtudiantsM1C = (ArrayList<Etudiant>) qBD.recupListeEtudiantParPromo("M1C");
            ArrayList<Etudiant> listEtudiantsM2C = (ArrayList<Etudiant>) qBD.recupListeEtudiantParPromo("M2C");
            //On met les listes dans le context
            request.setAttribute("listEtudiantsL3C", listEtudiantsL3C);
            request.setAttribute("listEtudiantsM1C", listEtudiantsM1C);
            request.setAttribute("listEtudiantsM2C", listEtudiantsM2C);
            // On forward vers la JSP notification.jsp
            return mapping.findForward("arriveeNotif");
        } else {
            NotificationForm cf = (NotificationForm) form;
            // On note 4 cas différents
            //       -- si le secretariat a choisi de notifier les étudiants/enseignants/maitre de stage
            //       -- si le secretariat a choisi de notifier les étudiants/enseignants
            //       -- si le secretariat a choisi de notifier les étudiants/maitre de stage
            //       -- si le secretariat a choisi de notifier les étudiants
            String[] listEtuSelectionnes;
            HashSet<Enseignant> listEnseignants;
            HashSet<MaitreDeStage> listMaitreStage;
            HashSet<Etudiant> listEtudiants;
            String dateNotif = cf.getDateNotif();
            String heureNotif = cf.getHeureNotif();
            String typeNotif = cf.getTypeNotif();
            String[] persNotif = cf.getPersNotif();
            EnvoyerMail eM = new EnvoyerMail();
            //1er cas
            if (persNotif.length == 2) { 
                //1- On récupère la liste des étudiants selectionnés et on daire une requete sur la BD pour avoir le nom/prenom/email
                listEtuSelectionnes = cf.getListEtudiants();
                listEtudiants = (HashSet<Etudiant>) qBD.recupEtudiantsNotif(listEtuSelectionnes);
                //2- On récupère la liste des enseignants des étudiants selectionnés
                listEnseignants = (HashSet<Enseignant>) qBD.recupEnseignantsNotif(listEtuSelectionnes);
                //3- On récupère la liste des maitres de stages des étudiants selectionnés
                listMaitreStage = (HashSet<MaitreDeStage>) qBD.recupMaitreDeStageNotif(listEtuSelectionnes);
                //4- On envoie le message à la liste créee précédemment
                eM.notifier(listEtudiants, listEnseignants, listMaitreStage, typeNotif,dateNotif,heureNotif);
                //2ème cas
            } else {              
                if (persNotif.length == 1 && persNotif[0].equals("enseignant")) {
                    //1- On récupère la liste des étudiants selectionnés
                    listEtuSelectionnes = cf.getListEtudiants();
                    listEtudiants = (HashSet<Etudiant>) qBD.recupEtudiantsNotif(listEtuSelectionnes);
                    //2- On récupère la liste des enseignants des étudiants selectionnés
                    listEnseignants = (HashSet<Enseignant>) qBD.recupEnseignantsNotif(listEtuSelectionnes);
                    //3- On envoie le message à la liste créee précédemment
                    eM.notifier(listEtudiants, listEnseignants, null, typeNotif,dateNotif,heureNotif);
                } else {
                    if (persNotif.length == 1 && persNotif[0].equals("maitreDeStage")) {
                        //1- On récupère la liste des étudiants selectionnés
                        listEtuSelectionnes = cf.getListEtudiants();
                        listEtudiants = (HashSet<Etudiant>) qBD.recupEtudiantsNotif(listEtuSelectionnes);
                        //2- On récupère la liste des maitres de stages des étudiants selectionnés
                        listMaitreStage = (HashSet<MaitreDeStage>) qBD.recupMaitreDeStageNotif(listEtuSelectionnes);
                        //3- On envoie le message à la liste créee précédemment
                        eM.notifier(listEtudiants, null, listMaitreStage, typeNotif,dateNotif,heureNotif);
                    } else {
                        if (persNotif.length == 0) {
                            //1- On récupère la liste des étudiants selectionnés
                            listEtuSelectionnes = cf.getListEtudiants();
                            listEtudiants = (HashSet<Etudiant>) qBD.recupEtudiantsNotif(listEtuSelectionnes);
                            //2- On envoie le message à la liste créee précédemment
                            eM.notifier(listEtudiants, null, null, typeNotif,dateNotif,heureNotif);
                        }
                    }
                }
            }
            return mapping.findForward("faireNotif");
        }
    }
}
